其他
Perl学习08之子程序
"pythonic生物人"的第13篇分享
摘要
Perl中子程序定义、调用、参数传递及子程序中return函数使用。
目录
2、调用子程序
3、子程序传递参数(arguments)
4、子程序使用举例
5、子程序中return函数使用
正文开始啦
语法:
sub 子程序名{};
子程序命名遵守字母,数字,下划线,首行不能为下划线的规则;
调用子程序称为call子程序,使用与号 &子程序名调用,为了防止子程序名与Perl内置函数歧义尽量不要省略&号;
子程序执行过程中,最后一次计算结果会被当成子程序的的返回值;
例如,sub2.pl
#!/usr/bin/perl
use strict;
use warnings;
my $a=1;
my $b=2;
my $result1=sum_a_b();
my $result2=sum_a_b1();
print "$result1\n\n";
print "$result2\n";
sub sum_a_b{
print "Calling sum_a_b\n";#用于辅助调试,确认该子程序被调用到了
$a+$b;
}
sub sum_a_b1{
print "Calling sum_a_b1\n";
$a+$b;
print "Calling sum_a_b1\n";#此时该子程序返回结果为1,表示子程序成功输出信息
}
perl sub2.pl
Useless use of addition (+) in void context at sub2.pl line 23.#sum_a_b1子程序结尾print导致
Calling sum_a_b
Calling sum_a_b1
Calling sum_a_b1
3
1
传递参数存储在默认数组@_中,调用子程序时,调用@_中元素
例如,sub3.pl
#!/usr/bin/perl
use strict;
use warnings;
my $result=sum_a_b_arg(1,2);#传入参数1,2默认存储在默认数组@_中
print "$result\n";
sub sum_a_b_arg{
print "Calling sum_a_b\n";
my ($a,$b)=@_;#调用默认数组@_中元素
$a+$b;
}
4、子程序使用举例
求数组中的最大值。
逻辑:传入一个数组,行首取出一个值赋给$max_sofar设为当前最大值,$max_sofar与余下数组中值比较,余下值比$max_sofar大,$max_sofar被余下值重新赋值,直到结束。
例如,max.pl
#!/usr/bin/perl
use strict;
use warnings;
my $max = &max_number(@ARGV);
print "$max\n";
sub max_number{
print "calling max_number\n";
if (scalar @_ > 0){
my $max_sofar = shift @_;
foreach (@_){
if ($_ > $max_sofar){
$max_sofar = $_;
}
}
$max_sofar;#foreach最终结果
}else{
die "no argvments:$!";
}
}
perl max.pl 0 2 5
calling max_number
5
perl max.pl
calling max_number
no argvments: at max.pl line 21.
5、子程序中return函数使用
主要使用在子程序中,返回某个值并立即终止子程序。
例如,return.pl
#!/usr/bin/perl
use strict;
use warnings;
my @names = qw/ fred barney betty dino wilma pebbles bamm-bamm /;
my $result = &which_element_is("dino", @names);
print "$result\n";
sub which_element_is{
my ($what,@array) = @_;
foreach my $i (0..$#array){
if ($what eq $array[$i]){
return $i; #返回$i并立即停止执行子程序
print "do this\n";#不会执行该句
}
}
return -1;
}
perl return.pl
3